package cn.edu.zafu.bigdata.liuwenyi;


import java.io.*;
import java.util.TreeSet;

public class RhymingWords {
    public static void main(String[] args) throws IOException {
        FileReader words = new FileReader("files/words.txt");

        // 进行单词的逆序、排序、再逆序还原
        Reader rhymedWords = reverse(sort(reverse(words)));

        // 将处理后的单词列表输出显示
        BufferedReader in = new BufferedReader(rhymedWords);
        String input;
        while ((input = in.readLine()) != null) {
            System.out.println(input);
        }
        in.close();
    }

    // 创建管道，创建并启动单词逆序线程
    public static Reader reverse(Reader source) throws IOException {
        BufferedReader in = new BufferedReader(source);
        PipedWriter pipeOut = new PipedWriter();
        PipedReader pipeIn = new PipedReader(pipeOut);
        PrintWriter out = new PrintWriter(pipeOut);
        new ReverseThread(out, in).start();
        return pipeIn;
    }

    // 创建管道，创建并启动单词排序线程
    public static Reader sort(Reader source) throws IOException {
        BufferedReader in = new BufferedReader(source);
        PipedWriter pipeOut = new PipedWriter();
        PipedReader pipeIn = new PipedReader(pipeOut);
        PrintWriter out = new PrintWriter(pipeOut);
        new SortThread(out, in).start();
        return pipeIn;
    }

    // 逆序线程类
    static class ReverseThread extends Thread {
        private final PrintWriter out;
        private final BufferedReader in;

        public ReverseThread(PrintWriter out, BufferedReader in) {
            this.out = out;
            this.in = in;
        }

        public void run() {
            try {
                String line;
                while ((line = in.readLine()) != null) {
                    out.println(new StringBuilder(line).reverse().toString());
                }
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    // 排序线程类
    static class SortThread extends Thread {
        private final PrintWriter out;
        private final BufferedReader in;

        public SortThread(PrintWriter out, BufferedReader in) {
            this.out = out;
            this.in = in;
        }

        public void run() {
            try {
                TreeSet<String> set = new TreeSet<String>();
                String line;
                while ((line = in.readLine()) != null) {
                    set.add(line);
                }
                for (String s : set) {
                    out.println(s);
                }
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}